package com.freedom.base.interceptor;

import com.freedom.auth.mapper.PermissionMapper;
import com.freedom.auth.service.IPermissionService;
import com.freedom.base.annotation.FreedomPermission;
import com.freedom.base.context.LoginContext;
import com.freedom.org.domain.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;

/**
 * @author freedom
 */
@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private IPermissionService permissionService;

    @Override
    public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {
        // 拿到token
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            response.getWriter().println("{\"result\":false,\"msg\":\"noLogin\"}");
            // token为空
            return false;
        }
        // 通过token拿到user
        Employee object = (Employee) LoginContext.loginMap.get(token);
        LoginContext.loginMap.get(token);
        if (Objects.isNull(object)) {
            response.getWriter().println("{\"result\":false,\"msg\":\"noLogin\"}");
            // token错误
            return false;
        }

        /**
         * 鉴权
         * 1、查看是否需要权限 判断当前用户要访问的资源  有没有这个权限
         *     1.1 判断方法上是否有权限注解，没有则说明不需要权限访问，直接放行
         *     1.2 获取当前用户的所有的权限
         *     1.3 获取当前资源的访问权限
         *     1.4 用户拥有的权限是否包含这个资源的权限，包含则放行，不包含拦截返回错误信息
         */

        // 查看是否需要权限 判断当前用户要访问的资源  有没有这个权限
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();

        // 判断方法上是否有权限注解，没有则说明不需要权限访问，直接放行
        FreedomPermission annotation = method.getAnnotation(FreedomPermission.class);

        if (Objects.isNull(annotation)) {
            // 不需要权限，放行
            return true;
        }

        // 获取当前用户的所有的权限
        List<String> sns = permissionService.getUserSnById(object.getId());

        //用户拥有的权限是否包含这个资源的权限，包含则放行，不包含拦截返回错误信息
        String sn = method.getDeclaringClass().getSimpleName() + ":" + method.getName();
        if (!sns.contains(sn)) {
            response.getWriter().println("{\"result\":false,\"msg\":\"noPermission\"}");
            return false;
        }

        return true;

    }
}
